﻿#define _CRT_SECURE_NO_WARNINGS 1

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param str string字符串
     * @return string字符串vector
     */
    void swap(string& str, int begin, int end)
    {
        char tmp = str[begin];
        str[begin] = str[end];
        str[end] = tmp;
    }
    void _Helper(string str, set<string>& vec, int start)
    {
        if (start == str.size() - 1)
        {
            vec.insert(str);
        }
        for (int i = start; i < str.size(); ++i)
        {
            swap(str, start, i);

            _Helper(str, vec, start + 1);

            swap(str, start, i);
        }
    }
    vector<string> Permutation(string str)
    {
        if (str.size() == 0)
        {
            return vector<string>();
        }
        set<string> ans;
        _Helper(str, ans, 0);
        vector<string> vec(ans.begin(), ans.end());
        return vec;
    }
};

/*
描述
输入一个长度为 n 字符串，打印出该字符串中字符的所有排列，你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

数据范围：n<10
要求：空间复杂度O(n!)，时间复杂度O(n!)
输入描述：
输入一个字符串,长度不超过10,字符只包括大小写字母。

示例1
输入：
"ab"

返回值：
["ab","ba"]

说明：
返回["ba","ab"]也是正确的

*/

